<?php
namespace Peas\Cache;

use Peas\Cache\Store\StoreInterface;

/**
 * Peas Framework
 *
 * 缓存操作类
 *
 * 自定义存储器说明：<br>
 * 自定义存储器是指使用非peas自带存储器，需实现Peas\Cache\Store\StoreInterface接口，且确保能够自动加载<br>
 * 在传入参数时，自定义存储器名称需要为完整的带命名空间的类名，如：Peas\Cache\Store\ApcStore<br>
 *
 * @author  Hongzan Zhang <zhanghongzan@163.com>
 * @version $Id$
 */
class CacheStore
{
    /**
     * 默认配置：key前缀，默认为空
     *
     * @var string
     */
    public $prefix = '';

    /**
     * 默认配置：缓存有效期（秒），-1表示永久有效，默认值为86400
     *
     * @var int
     */
    public $defaultLifetime = 86400;


    /**
     * 具体缓存管理类
     *
     * @var StoreInterface
     */
    private $_store = null;


    /**
     * 初始化，设置参数及默认缓存管理类
     *
     * @param string $store           默认存储器类型，可以是apc,file,xCache，默认为apc，也可以是自定义存储器名称，默认值为apc
     * @param array  $storeConfig     默认存储器参数，没有可不传，默认值为[]
     * @param string $prefix          key前缀，默认值为空
     * @param int    $defaultLifetime 缓存默认有效期（秒），-1表示永久有效，默认值为86400
     */
    public function __construct($store = 'apc', $storeConfig = [], $prefix = '', $defaultLifetime = 86400)
    {
        if (!class_exists($store)) {
            $store = '\\Peas\\Cache\\Store\\' . ucfirst($store) . 'Store';
        }
        $this->_store = new $store($storeConfig);

        $this->prefix = $prefix;
        $this->defaultLifetime = $defaultLifetime;
    }


    /**
     * 删除缓存
     *
     * @param  string  $id 缓存ID
     * @return boolean 成功返回true，失败返回false
     */
    public function remove($id)
    {
        return $this->_store->remove($this->prefix . $id);
    }

    /**
     * 清空所有缓存记录
     *
     * @return boolean 成功返回true，失败返回false
     */
    public function clear()
    {
        return $this->_store->clear();
    }

    /**
     * 设置缓存
     *
     * @param  string  $id       缓存ID
     * @param  mixed   $value    缓存值
     * @param  int     $lifetime 缓存有效期（秒），0表示使用默认，-1表示永久有效
     * @return boolean 成功返回true，失败返回false
     */
    public function set($id, $value, $lifetime = 0)
    {
        if ($lifetime == 0) {
            $lifetime = $this->defaultLifetime;
        } elseif ($lifetime == -1) {
            $lifetime = 8640000000;
        }
        return $this->_store->set($this->prefix . $id, $value, $lifetime);
    }

    /**
     * 获取缓存
     *
     * @param  string      $id 缓存ID
     * @return mixed|false 成功返回缓存数据，失败返回false
     */
    public function get($id)
    {
        return $this->_store->get($this->prefix . $id);
    }

    /**
     * 验证缓存有效性
     *
     * @param  string    $id 缓存ID
     * @return int|false 有效时返回最后更新时间的时间戳，无效返回false
     */
    public function test($id)
    {
        return $this->_store->test($this->prefix . $id);
    }
}
